package componentes;

import java.lang.reflect.Constructor;

import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.QName;

public abstract class ElementoUbicableEnTerreno implements EscribibleEnXML {

	private Posicion posicion;
	
	public ElementoUbicableEnTerreno(Posicion posicion) {
		this.posicion = posicion;
	}
	
	public Posicion getPosicion(){
		return this.posicion;
	}
	
	public void setPosicion(Posicion posicion){
		this.posicion = posicion;
	}
	
	public abstract boolean estaEnJuego();
	
	public final Element toXML() {
		Element element = DocumentHelper.createElement(getElementName());
		element.addAttribute("class", getClass().getName());
		element.addAttribute("id", Integer.toHexString(this.hashCode()));		
		element.add(this.getPosicion().toXML());
		fillXMLElement(element);
		
		return element;
	}

	protected abstract void fillXMLElement(Element element);

	protected abstract String getElementName();
	
	protected static ElementoUbicableEnTerreno recuperarDesdeXML(Element xmlElemento){
		try{
			Constructor constructor = Class.forName(xmlElemento.attributeValue("class")).getConstructor(Posicion.class);
			ElementoUbicableEnTerreno elemento = (ElementoUbicableEnTerreno) constructor.newInstance(Posicion.recuperarDesdeXML(xmlElemento.element("posicion")));
			return elemento;
		} catch (Exception e){
			return null;
		}
		
	}
}
